#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
根据rosdep_new.csv中的映射关系，为base.yaml添加openeuler系统的映射，生成base_1028.yaml
"""
import os
import yaml
import csv
import sys
from pathlib import Path

def load_csv_mapping(csv_file):
    """
    从CSV文件中加载包名映射关系
    
    Args:
        csv_file (str): CSV文件路径
    
    Returns:
        dict: 包名映射字典 {original_name: openeuler_name}
    """
    mapping = {}
    try:
        with open(csv_file, 'r', encoding='utf-8') as f:
            reader = csv.reader(f)
            for row in reader:
                if len(row) >= 2:
                    original_name = row[0].strip()
                    openeuler_name = row[1].strip()
                    mapping[original_name] = openeuler_name
        print(f"成功加载 {len(mapping)} 条包名映射")
        return mapping
    except Exception as e:
        print(f"读取CSV文件时出错: {str(e)}")
        sys.exit(1)

def process_yaml(base_yaml, csv_mapping, output_yaml):
    """
    处理YAML文件，添加openeuler映射
    
    Args:
        base_yaml (str): 原始YAML文件路径
        csv_mapping (dict): 包名映射字典
        output_yaml (str): 输出YAML文件路径
    """
    # 读取原始YAML文件
    try:
        # 使用更底层的方式读取文件，保持原始格式
        with open(base_yaml, 'r', encoding='utf-8') as f:
            yaml_content = f.read()
        print(f"成功读取原始YAML文件")
    except Exception as e:
        print(f"读取YAML文件时出错: {str(e)}")
        sys.exit(1)
    
    # 处理每个需要添加openeuler映射的包
    added_count = 0
    for original_name, openeuler_name in csv_mapping.items():
        import re
        # 使用更精确的正则表达式匹配完整的包定义块，确保不会错误匹配
        # 匹配包名行，然后匹配所有缩进的内容直到遇到下一个非缩进的包名行或文件结束
        package_pattern = rf'^{original_name}:\s*(?:\n|$)((?:\s+.+?(?:\n|$))*)'  # 匹配包名和所有缩进的内容
        
        # 查找包定义
        match = re.search(package_pattern, yaml_content, re.MULTILINE)
        if match:
            # 检查是否已经有openeuler映射
            if re.search(r'\n\s*openeuler:', match.group(0)):
                print(f"{original_name} 已经存在 openeuler 映射，跳过")
                continue
            
            # 获取包定义的缩进级别
            # 分析包定义中的第一行缩进内容来确定正确的缩进格式
            indent = '  '  # 默认缩进
            if match.group(1).strip():
                # 找到第一个非空缩进行
                first_indented_line = re.search(r'^(\s+)', match.group(1), re.MULTILINE)
                if first_indented_line:
                    indent = first_indented_line.group(1)
            
            # 找到包定义块的最后一个换行符位置
            package_end_pos = match.end()
            # 我们需要在包定义块的最后一个缩进行之后、下一个包定义之前插入
            
            # 从包定义的匹配内容中找到最后一个换行符位置
            last_newline_pos = match.group(0).rfind('\n')
            
            if last_newline_pos != -1:
                # 计算在整个yaml_content中的插入位置
                insert_pos = match.start() + last_newline_pos + 1
            else:
                # 如果没有换行符，就在包名行后插入（添加缩进）
                insert_pos = match.end()
            
            # 构建openeuler映射条目，确保有正确的缩进和换行
            openeuler_entry = f'{indent}openeuler: [{openeuler_name}]\n'
            
            # 插入openeuler映射
            yaml_content = yaml_content[:insert_pos] + openeuler_entry + yaml_content[insert_pos:]
            added_count += 1
            print(f"为 {original_name} 添加 openeuler 映射: {openeuler_name}")
        else:
            print(f"警告：未找到 {original_name} 的包定义")
    
    # 保存修改后的YAML文件
    try:
        with open(output_yaml, 'w', encoding='utf-8') as f:
            f.write(yaml_content)
        print(f"成功保存修改后的YAML文件到 {output_yaml}")
        print(f"共添加 {added_count} 个openeuler映射")
    except Exception as e:
        print(f"保存YAML文件时出错: {str(e)}")
        sys.exit(1)

def main():
    """
    主函数
    """
    # 设置文件路径
    current_dir = os.path.dirname(os.path.abspath(__file__))
    base_yaml = os.path.join(current_dir, 'base.yaml')
    csv_file = os.path.join(current_dir, 'rosdep_new.csv')
    output_yaml = os.path.join(current_dir, 'base_1028.yaml')
    
    # 检查文件是否存在
    if not os.path.exists(base_yaml):
        print(f"错误：文件 {base_yaml} 不存在")
        sys.exit(1)
    
    if not os.path.exists(csv_file):
        print(f"错误：文件 {csv_file} 不存在")
        sys.exit(1)
    
    print("开始处理...")
    # 加载CSV映射
    csv_mapping = load_csv_mapping(csv_file)
    # 处理YAML文件
    process_yaml(base_yaml, csv_mapping, output_yaml)
    print("处理完成！")

if __name__ == "__main__":
    main()